package main

import (
	"fmt"
	"math"
)

func main() {

	/*
		四. 匿名函数。 匿名函数格式：func (参数列表) (返回值列表) { // 函数体 }

		即在需要使用函数时再定义函数。匿名函数没有函数名，只有函数体，函数可以作为一种类型被赋值给变量，匿名函数也往往以变量方式被传递。

		TIPS：
			① 匿名函数因为没有函数名，所以没办法像普通函数那样调用，所以匿名函数需要保存到某个变量或者作为立即执行函数；
			② 匿名函数经常被用于实现回调函数、闭包等；
	*/
	// 匿名函数没有函数名，只有函数体
	func(i int) {
		fmt.Println("匿名函数结果：", i)
	}(100)
	// 匿名函数作为为一种类型被赋值给变量
	f := func(str string) {
		fmt.Println("匿名函数以变量方式被传递的结果：", str)
	}
	f("这就是结果")
	// 匿名函数以变量方式被传递，实现回调函数
	float64s := []float64{1, 4, 9, 16, 25, 36, 49}
	visit(float64s, func(sp float64) {
		fmt.Printf("实现回调函数：%.0f \n", math.Sqrt(sp))
	})
}

/*
使用函数作为变量对切片元素进行遍历处理
*/
func visit(spc []float64, f func(sp float64)) {

	// 不需要下标，使用匿名变量
	for _, value := range spc {
		f(value)
	}
}
